package spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


/***
 *  aop增强处理类
 */

//@Aspect
//@Component
public class AspectHandler {

    @Pointcut("execution(* com.jyhs.maven.service.impl.*.*(..))")
    public void pointcut() {}

    @Before("pointcut()")
    // 前置通知  JoinPoint jp 包含了目标对象（target）、方法名（signature）、方法参数（args）等信息
    public void beforeAdvice(JoinPoint jp) {
        System.out.println("aop前置通知：调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
                + " 方法。方法入参：" + jp.getArgs());
    }
    @After("pointcut()")
    public void afterAdvice(JoinPoint jp) {

        System.out.println("aop后置通知：调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
                + " 方法结束。");
    }
    @AfterReturning(pointcut="pointcut()", returning="resultT02")
    public void afterReturningAdvice(JoinPoint jp, Object resultT02) {

        System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
                + ",方法返回:"+resultT02);
    }

    @AfterThrowing(pointcut="pointcut()", throwing="ex")
    public void afterThrowingAdvice(JoinPoint jp, Throwable ex) {

        System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
                + " 方法时发生异常：" + ex.getMessage());
    }



    @Around("pointcut()")
    public Object aroundAdvice(ProceedingJoinPoint jp) {

        System.out.println("aop环绕通知：调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
                + " 方法。");
        Object result = null;
        try {
            result = jp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("环绕通知结束，方法返回：" + result);
        return result;
    }


}
